/* 
 * @author sam.zheng 2013年5月5日19:23:44
 * @description js弹窗代码，依赖于jquery 1.7.2 
 * @coypright sixboy
 */
var SixBoy = {
    index : 1,
    tool : {},
    window :{},
    validateBox:{
        required : true,
        validType :{}, //验证类型
        missingMessage :"",//为空时提示信息
        invalidMessage:""//验证不通过是信息信息
    },
    reg:{
        Email : /^[a-zA-Z0-9_\-]{1,}@[a-zA-Z0-9_\-]{1,}\.[a-zA-Z0-9_\-.]{1,}$/
    }
}
//只能输入数字：“^[0-9]*$”
//只能输入n位的数字：“^d{n}$”
//只能输入至少n位数字：“^d{n,}$”
//只能输入m-n位的数字：“^d{m,n}$”
//只能输入零和非零开头的数字：“^(0|[1-9][0-9]*)$”
//只能输入有两位小数的正实数：“^[0-9]+(.[0-9]{2})?$”
//只能输入有1-3位小数的正实数：“^[0-9]+(.[0-9]{1,3})?$”
//只能输入非零的正整数：“^+?[1-9][0-9]*$”
//只能输入非零的负整数：“^-[1-9][0-9]*$”
//只能输入长度为3的字符：“^.{3}$”
//只能输入由26个英文字母组成的字符串：“^[A-Za-z]+$”
//只能输入由26个大写英文字母组成的字符串：“^[A-Z]+$”
//只能输入由26个小写英文字母组成的字符串：“^[a-z]+$”
//只能输入由数字和26个英文字母组成的字符串：“^[A-Za-z0-9]+$”
//只能输入由数字、26个英文字母或者下划线组成的字符串：“^w+$”
//验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为：以字母开头，长度在6-18之间，
//
//
//只能包含字符、数字和下划线。
//验证是否含有^%&',;=?$"等字符：“[^%&',;=?$x22]+”
//只能输入汉字：“^[u4e00-u9fa5],{0,}$”
//验证Email地址：“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
//验证InternetURL：“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
//验证电话号码：“^((d{3,4})|d{3,4}-)?d{7,8}$”

SixBoy.tool = function(){
    return {
        isIE :function(){
            return !!window.ActiveXObject;
        },
        isFF:function(){
            return navigator.userAgent.indexOf("Firefox")>0 ;
        },
        isChrome:function(){
            return navigator.userAgent.indexOf("Chrome")>0 ;
        },
        getBrowserVersion: function(){
            var trim_Version=navigator.userAgent;
            if(this.isIE()){
                if(trim_Version.indexOf("MSIE 7.0")>0){
                    return "IE7";
                }
                if(trim_Version.indexOf("MSIE 6.0")>0){
                    return "IE6";
                }
                if(trim_Version.indexOf("MSIE 8.0")>0){
                    return "IE8";
                }
                if(trim_Version.indexOf("MSIE 9.0")>0){
                    return "IE9";
                }
                if(trim_Version.indexOf("MSIE 10.0")>0){
                    return "IE10";
                }
                return "unkown";
            }
            if(this.isFF()){
                return "Firefox";
            }
            if(this.isFF()){
                return "Chrome"; 
            }
            return "unkown";
        },
        getStrlength:function(str){
            var cArr = str.match(/[^x00-xff]/ig);
            return str.length + (cArr == null ? 0 : cArr.length);
        },
        testReg : function(reg,str){ 
            var patten = new RegExp(reg);
            return patten.test(str);
        }
    }
}
SixBoy.window = function() {
    var W = "win_";
    var dialog = function(cfg){   
        var id = W + cfg.id;
        var tool = new SixBoy.tool();
        cfg.content = cfg.content || "";
        var dialogHtml = "<div id='"+id+"'>"+ cfg.content +"</div>";
        if(tool.getBrowserVersion() == "IE6"&&cfg.href!=null){
            dialogHtml = "<div id='"+id+"'><iframe src='"+cfg.href+"' id='iframe"+id+"' name='iframe"+id+"' width='"+cfg.width+"px' heigth='"+cfg.height+"px' frameborder='0' style='_width:99.6%'></iframe></div>";
            cfg.href = null;
        }
        if(!$("#"+id)[0]){
            $("body").append(dialogHtml);
        }
        cfg.title = cfg.title||"弹窗";
        cfg.width = cfg.width||200;
        cfg.height = cfg.height||150;
        cfg.modal = cfg.modal || true;
        cfg.collapsible =  cfg.collapsible || false;
        cfg.minimizable = cfg.minimizable || false;
        cfg.maximizable = cfg.maximizable  || false;
        cfg.resizable = cfg.resizable || false;
        $('#'+id).dialog({  
            title : cfg.title,  
            width :  cfg.width,  
            height : cfg.height,  
            closed : cfg.closed,  
            cache :  cfg.cache,  
            href :   cfg.href,  
            modal :  cfg.modal,
            buttons : cfg.buttons,
            toolbar : cfg.toolbar,
            collapsible : cfg.collapsible,
            minimizable : cfg.minimizable,
            maximizable : cfg.maximizable,
            resizable : cfg.resizable
        });
    }
    var message = function(cfg){
        $.messager.alert(cfg.title,cfg.content,cfg.infotype); 
    }
    var tooltip = function (cfg){
        var id = "boytooltip-"+cfg.id;
        var title = $("#"+cfg.id).attr("title")||cfg.content||"";
        $("#"+cfg.id).removeAttr("title");
        var  tipHml = '<div id="'+id+'" class="tooltip tooltip-bottom" style="z-index: 9009; position:absolute;display:none">'+
        '<div class="tooltip-content">'+title+'</div>'+
        '<div class="tooltip-arrow-outer" style="border-bottom-color: rgb(149, 184, 231);"></div>'+
        '<div class="tooltip-arrow" style="border-bottom-color: rgb(255, 255, 255);"></div></div>';
        if($("#"+id)[0]){
            $("#"+id).remove();
        }
        $(tipHml).appendTo("body");
        var tip = $("#"+id);
        $("#"+cfg.id).bind("mouseover",function(e){
            tip.show();
            var x = Math.ceil($("#"+cfg.id).offset().left);
            var y = Math.ceil($("#"+cfg.id).offset().top + $("#"+cfg.id).height());
            var xContentGap = Math.ceil($("#"+id+" .tooltip-content").width()/2 - $("#"+cfg.id).width()/2);
            x = x-xContentGap - 5; //偏差
            tip.css({
                left:x,
                top:(y+6)
            });
        }).bind("mouseout", function(){
            tip.hide();
        }); 
    }
    return {
        /**
    	 * title :标题
    	 * content :内容
    	 * type : 窗口类型（error,question,info,warning）
    	 */
        alert : function (title,content,type){ //type : error,question,info,warning.
            type = type ||"info";
            var cfg = {
                "title":title,
                "content":content,
                "infotype":type
            };
            message(cfg);
        },
        /**
    	 * title :标题
    	 * content :内容
    	 * callback ： 回调函数
    	 */
        confirm : function(title,content,callback){
            $.messager.confirm(title, content, function(r){
                if(r){
                    callback();
                }
            }
            );
        },
        /**
         *  cfg{}  包含以下属性值
         *  id : 元素ID
         *  title : 标题
          * width :  宽度
          * height : 高度
          * closed : 关闭按钮 
          * cache :  启用缓存,  
          * href :   链接地址,  
          * modal :  是否模态对话框,
          * buttons : 按钮,
          * toolbar : 工具栏,
          * collapsible : 是否可扩展大小,
          * minimizable : 最小化,
          * maximizable :  最大化,,
          * resizable : 是否可以移动
         * 
         */
        dialog : function(cfg){
            dialog(cfg);
        },
        /**
    	 * elementId :元素ID
    	 * tipTitle : 提示信息
    	 */
        tooltip : function (elementId,tipTitle){
            var cfg = {
                content:tipTitle,
                id:elementId
            };
            tooltip(cfg);
            
        },
        /**
    	 * title :标题
    	 * content :内容
    	 * callback ： 回调函数
    	 */
        messageBox : function(title,content,callback){
            var htm = '<div class="messager-icon messager-info" style="margin:10px 0px 0px 10px"></div><div style="margin:20px 0 0 47px">'+content+'</div>';
            var cfg = {
                "id" :"0",
                "title":title,
                "content":htm,
                buttons:[
                {  
                    text:'确定',  
                    handler:function(){  
                        if(callback){
                            callback();
                        }else{
                            $('#'+W+cfg.id).dialog('close');
                        }
                    }
                },
                {  
                    text:'关闭',  
                    handler:function(){  
                        $('#'+W+cfg.id).dialog('close');
                    }
                }
                ]
            };
            dialog(cfg);
        },
        close : function(id){ //关闭窗口
            $('#'+W+id).dialog('close');
        }
    }
}
var win = new  SixBoy.window();
SixBoy.validateBox = function(){
    var doValidateReg = function(exp){
        var tool = new SixBoy.tool();
        var domValue = exp.domValue;
        if(exp.required){
            if(domValue ==null || domValue ==""){
                return false;
            }
        }
        var obj = exp.validType;
        for(var p in obj){
            switch(p){
                case "length":
                    var length = obj[p];
                    var min = length.minLength;
                    var max = length.maxLength;
                    var len = tool.getStrlength(domValue);
                    if(len<min||len>max){
                        return false;
                    }
                    break;
                case "email":
                    var email = obj[p];
                    return tool.testReg(email.reg, domValue);
                    break;
                case "custom":
                    var custom = obj[p];
                    return tool.testReg(custom.reg, domValue);
                    break;    
                default :
                    return true;
            }
        }
        return true;
    }
    var initToolTip = function(cfg){
        var id = "boytooltip-"+cfg.type+"-"+cfg.id;
        var title = $("#"+cfg.id).attr("title")||cfg.content||"";
        var exp = {
            required:cfg.required||{},
            validType:cfg.validType||{},
            domValue:$("#"+cfg.id).val()||""
        };
        if(!doValidateReg(exp)){
            $("#"+cfg.id).attr("rule", "required-"+cfg.type);
        }else{
            $("#"+cfg.id).removeAttr("rule");
        }
        var  tipHml = '<div id="'+id+'" class="tooltip tooltip-right" tabindex="-1" style="z-index: 9009; position:absolute;display:none;background-color: rgb(255, 255, 204);">'+
        '<div class="tooltip-content" >'+title+'</div>'+
        '<div class="tooltip-arrow-outer" style="border-right-color: rgb(149, 184, 231);"></div>'+
        '<div class="tooltip-arrow" style="border-right-color: rgb(255, 255, 204);"></div></div>';
        $(tipHml).appendTo("body");
        addToolTip(cfg);
    }
    var showToolTip = function(cfg){
        var id = "boytooltip-"+cfg.type+"-"+cfg.id;
        $("#"+id).show();
        var x = Math.ceil($("#"+cfg.id).offset().left + $("#"+cfg.id).width());
        var y = Math.ceil($("#"+cfg.id).offset().top);
        var xContentGap = Math.ceil($("#"+id+" .tooltip-content").width()/2 - $("#"+cfg.id).width()/2);
        var yContentGap = Math.ceil($("#"+id+" .tooltip-content").height()/2 - $("#"+cfg.id).height()/2);
        x = x-xContentGap-5; //偏差
        y = y-yContentGap-5;
        var tip = $("#"+id);
        tip.css({
            left:x,
            top: y
        });
    }
    var addToolTip = function (cfg){
        var id = "boytooltip-"+cfg.type+"-"+cfg.id;
        var startEvent = cfg.tirggerEvent || "click";
        var endEvent = "blur";
        $("#"+cfg.id).bind(startEvent,function(e){
            var exp = {
                required:cfg.required||{},
                validType:cfg.validType||{},
                domValue:$("#"+cfg.id).val()||""
            };
            if(doValidateReg(exp)){
                $("#"+id).hide();
                $("#"+cfg.id).removeClass("validatebox-invalid");
                $("#"+cfg.id).removeAttr("rule");
            }else{
                showToolTip(cfg);
                $("#"+cfg.id).addClass("validatebox-invalid");
                $("#"+cfg.id).attr("rule", "required-"+cfg.type);
            }
        })
        .bind(endEvent, function(){
            var exp = {
                required:cfg.required||{},
                validType:cfg.validType||{},
                domValue:$("#"+cfg.id).val()||""
            };
            if(doValidateReg(exp)){
                $("#"+id).hide();
                $("#"+cfg.id).removeClass("validatebox-invalid");
                $("#"+cfg.id).removeAttr("rule");
            }else{
                showToolTip(cfg);
                $("#"+cfg.id).addClass("validatebox-invalid");
                $("#"+cfg.id).attr("rule", "required-"+cfg.type);
            }
        });
    };
    
   
    return {
        
        validate : function(id,rule){
            rule.required = rule.required||false;
            var missingMessage = rule.missingMessage||"该字段不能为空值";
            var domValue = $("#"+id).val(); //dom值
            var cfg = {};
            if(rule.required){
                cfg = {
                    id:id,
                    type:"required",
                    content:missingMessage,
                    tirggerEvent:rule.tirggerEvent //触发事件
                };
                initToolTip(cfg);
            };
            if(rule.validType){
                var obj = rule.validType;
                var  invalidMessage = "";
                for(var p in obj){
                    switch(p){
                        case  "length" :
                            var minLength = obj[p].minLength||0;
                            var maxLength = obj[p].maxLength||256;
                            invalidMessage = obj[p].invalidMessage||"字符长度在"+minLength+"到"+maxLength+"之间";
                            cfg = {
                                id:id,
                                type:"length",
                                content:invalidMessage,
                                validType : {
                                    length:{
                                        minLength : minLength,
                                        maxLength : maxLength,
                                        domValue : domValue
                                    }
                                },
                                tirggerEvent:rule.tirggerEvent //触发事件
                            };
                            initToolTip(cfg);   
                            break;
                        case  "email" :
                            invalidMessage = obj[p].invalidMessage||"请输入正确的邮件地址";
                            cfg = {
                                id:id,
                                type:"email",
                                content:invalidMessage,
                                validType : {
                                    email:{
                                        domValue : domValue,
                                        reg : SixBoy.reg.Email
                                    }
                                },
                                tirggerEvent:rule.tirggerEvent //触发事件
                            };
                            initToolTip(cfg);   
                            break;
                        case "custom":
                            invalidMessage = obj[p].invalidMessage;
                            cfg = {
                                id:id,
                                type:"custom",
                                content:invalidMessage,
                                validType : {
                                    custom:{
                                        domValue : domValue,
                                        reg : obj[p].regular
                                    }
                                },
                                tirggerEvent:rule.tirggerEvent //触发事件
                            };
                            initToolTip(cfg);   
                            break;
                         
                        default :
                            break;
                    }
                }
            }
        },
        isValid : function (){ //验证表达是否验证通过，表单提交时调用
            var req =  $("input[rule*='required']");
            var allowSubmit = true;
            for(var i = 0;i<req.length;i++){
                var tag = $("#"+req[0].id).attr("rule");
                tag = tag.replace(/required-/,"");
                var eId =req[0].id;
                var cfg = {id:eId,type:tag};
                $("#"+eId).addClass("validatebox-invalid");
                showToolTip(cfg);
                allowSubmit = false;
            }
            return allowSubmit;
        }
    }
}
var validateBox = new SixBoy.validateBox();